#include <bits/stdc++.h>
using namespace std;


class Solution {
public:
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(), points.end());
        
        int ans = 1;
        int right = points[0][1];
        for(int i=1; i<points.size(); ++i){
            if(points[i][0] <= right){
                right = min(points[i][1], right);
            }
            else {
                ++ans;
                right = points[i][1];
            }
        }
        return ans;
    }
};

// class Solution {
// public:
//     int findMinArrowShots(vector<vector<int>>& points) {
//         // 按照左端点升序排序
//         sort(points.begin(), points.end());

//         int n = points.size();
//         // right表示当前重叠区域的右端点
//         // 如果新的气球左端点<= right，说明可通过上一次的箭引爆，此时只需要更新right
//         // 否则需要增加射箭次数并重设right
//         int right = points[0][1], ans = 1;
//         for (int i = 1; i < n; i++) {
//             if (points[i][0] <= right)
//                 right = min(right, points[i][1]);
//             else {
//                 ans++;
//                 right = points[i][1];
//             }
//         }

//         return ans;
//     }
// };  